-- 自举
local function bootstrap()
	-- 设置操作系统的路径分隔符 os.dirsep, C语言扩展模块的文件扩展名 os.cmodext
	local _, _, dirsep, cmodext = package.cpath:find("%.([\\/])?.(%w+);");
	os.dirsep, os.cmodext = dirsep, cmodext;
	-- 取得trunk路径(即当前运行的脚本文件路径,有可能是相对路径)，并保存到 os.trunkPath
	local path = string.sub(debug.getinfo(2).source, 2);
	os.trunkPath = string.match(path, "^(.*)" .. os.dirsep);
	-- 把trunk路径添加到包查找路径最前面
	package.path = string.format("%s%s?.lua;%s", os.trunkPath, os.dirsep, package.path);
	package.cpath = string.format("%s%s?.%s;%s", os.trunkPath, os.dirsep, os.cmodext, package.cpath);
end
bootstrap();

-- 加载包要放到自举之后，否则有可能因为路径问题找不到包
local zylib = require("zylib")
local hextools = require("hextools")
local phy6212 = require("phy6212")

local function printUsage()
	print(
[[
Usage(for hexf): lua flash.lua port hexf [mac=nil] [keepKVStore=true]
eg: lua flash.lua COM3 test.hexf AA750322ABCD false

Usage(for hex): lua flash.lua port hex flash_start_address [mac=nil] [keepKVStore=true]
eg: lua flash.lua COM3 test.hex 0x9000 AA750322ABCD
]]
	);
	error("Missing parameters !");
end

-- 主程序入口
local function main(argc, argv)
	if argc < 2 then printUsage(); end

	-- 打开串口
	local port = phy6212.open(argv[1]);

	-- 解析 HEX 文件
	local hex = hextools.parse(argv[2]);
	local isHexf = true;

	-- 计算 checksum/flashAddr
	for i, segment in ipairs(hex.segments) do
		segment.checksum = phy6212.checksum(segment.data);
		segment.flashAddr = segment.start * 0x10000 + segment.offset;
		print(string.format("No.%d   Flash_Addr: 0x%08X, size: %05X, checksum: 0x%08x",
			i, segment.flashAddr, #segment.data, segment.checksum));
		-- 如果有段地址为 0x1fff4800 的数据段，则表示不是 hexf 格式
		if segment.flashAddr == 0x1fff4800 then isHexf = false; end
	end

	-- MCU 重启进入烧录模式
	phy6212.resetToFlash(port);
	-- 等待重启完成
	os.sleep(0.5);

	if isHexf then
		-- 烧写 HEX
		phy6212.flashHexf(port, hex, zylib.toboolean(argv[4], true));
		-- 烧写 MAC
		if argv[3] then phy6212.flashMac(port, zylib.hex2Bin(argv[3])); end
	else
		if argc < 3 then printUsage(); end
		-- 烧写 HEX
		phy6212.flashHex(port, hex, argv[3], zylib.toboolean(argv[5], true));
		-- 烧写 MAC
		if argv[4] then phy6212.flashMac(port, zylib.hex2Bin(argv[4])); end
	end
	
	-- MCU 重启进入运行模式
	phy6212.resetToRun(port);

	port:close();
end

-- 进入主程序入口
main(#arg, arg);
